package solitaire.presentation ;

import java.awt.* ;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;
import java.io.Serializable;

import javax.swing.* ;

import solitaire.controle.CCarte;

/**
 * Pr&eacute;sentation d'une carte.
 * 
 * @author Andr&eacute; Simon, J&eacute;r&eacute;my Brault
 */
public class PCarte extends JPanel implements Transferable, Serializable {

	private static final long serialVersionUID = 1787602527910755637L;
	
	private CCarte controler ;		
	protected JLabel face, dos ;
	protected ImageIcon icone ;			
	protected static ImageIcon iconeDos;	
	public static int largeur, hauteur ;

	/**
	 * Constructeur.
	 * 
	 * @param chaine : Nom de la carte
	 * @param controle : Controlleur de la carte
	 */
	public PCarte(final String chaine, final CCarte controle) {
		this.controler = controle ;

		icone = new ImageIcon(ClassLoader.getSystemResource("cartesCSHD/" + chaine + ".gif"));
		face = new JLabel(icone);
		add(face);
		face.setLocation(0, 0);
		face.setSize(largeur, hauteur);

		dos = new JLabel(iconeDos);
		add(dos);
		dos.setLocation(0, 0);
		dos.setSize(largeur, hauteur);

		setLayout(null);
		setOpaque(true);
		setSize(face.getSize());
		setPreferredSize(getSize());
		setFaceVisible(false);
	}

	/**
	 * Constructeur.
	 * 
	 * @param chaine : Nom de la carte
	 */
	public PCarte (final String chaine) {
		this.controler = null ;

		icone = new ImageIcon(ClassLoader.getSystemResource("cartesCSHD/" + chaine + ".gif"));
		face = new JLabel(icone);
		add(face);
		face.setLocation(0, 0);
		face.setSize(largeur, hauteur);

		dos = new JLabel(iconeDos);
		add(dos);
		dos.setLocation(0, 0);
		dos.setSize(largeur, hauteur);

		setLayout(null);
		setBackground(Color.yellow);
		setOpaque(true);
		setSize(face.getSize());
		setPreferredSize(getSize());
		setFaceVisible(false);
	}

	/**
	 * Changer la visibilit&eacute; de la carte.
	 * 
	 * @param faceVisible : Vrai si la face est visible, faux sinon
	 */
	public void setFaceVisible (boolean faceVisible) {
		face.setVisible(faceVisible);
		dos.setVisible(!faceVisible);
	}

	/**
	 * @return : {@link CCarte} le controlleur de la carte
	 */
	public final CCarte getControler() {
		return controler;
	}

	public ImageIcon getIcone() {
		return icone;
	}

	/**
     *  Initialiser l'image du dos et les dimensions d'une PCarte.
	 */
	static {
		iconeDos = new ImageIcon(ClassLoader.getSystemResource("cartesCSHD/dos.jpg")) ;
		largeur = iconeDos.getIconWidth () + 4;
		hauteur = iconeDos.getIconHeight () + 4;
	}

	/*
	 * Partie Drag an Drop
	 */
	@Override
	public DataFlavor[] getTransferDataFlavors() {
		DataFlavor data[] = new DataFlavor[2];
		try {
			data [0] = new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType);
			
			data [1] = new DataFlavor(PCarte.class, null);
		} 
		catch(java.lang.ClassNotFoundException e) {
			
		}
		
		return (data);
	}
	
	@Override
	public boolean isDataFlavorSupported(DataFlavor flavor) {
		if((flavor.isMimeTypeEqual(DataFlavor.javaJVMLocalObjectMimeType)) || (flavor.isMimeTypeEqual(new DataFlavor(PCarte.class, null)))) {
			return (true);
		} 
		else {
			return (false);
		}
	}
	
	@Override
	public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
		Object result = null;
		if(flavor.isMimeTypeEqual(DataFlavor.javaJVMLocalObjectMimeType)) {
			result = this;
		} 
		else if(flavor.isMimeTypeEqual(new DataFlavor (PCarte.class, null))) {
			result = this;
		} 
		else {
			result = null;
		}
		
		return(result);
	}
	
	public static void main (String args []) {
		JFrame f = new JFrame ("Test PCarte") ;
		f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		f.setLayout(new FlowLayout());
		f.getContentPane ().setBackground(new Color(143, 143, 195));

		PCarte pc = new PCarte ("QH");
		pc.setFaceVisible(true);
		f.getContentPane ().add(pc) ;

		pc = new PCarte("1D");
		pc.setFaceVisible(false);
		f.getContentPane ().add(pc);

		f.pack ();
		f.setLocation(200,100);
		f.setVisible (true);
	}

} 
